package cc.csln.so.cdelayqueue;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;

/**
 * 延迟队列的 Spring Boot 配置绑定，前缀为 `c-delay-queue`。
 * 可通过 `application.yml` 或 `application.properties` 设置实现类型与参数。
 * <p>
 * 示例（YAML）:
 * c-delay-queue:
 * type: JVM
 * jvm:
 * delay-ms: 3000
 *
 * @author Cusalt
 * @since 2025/10/17 14:32
 **/
@Getter
@Setter
@ConfigurationProperties(prefix = "c-delay-queue")
public class CDelayQueueConfig {

    /**
     * 延迟队列的实现类型。
     * 配置键: `c-delay-queue.type`
     * 默认: `JVM`
     * 说明: 控制延迟队列的具体实现选型。
     */
    private EnumDelayQueueType type = EnumDelayQueueType.JVM;

    /**
     * 消费者线程池配置。
     * 前缀: `c-delay-queue.thread-pool`
     * 用途: 控制消费任务的线程并发与命名。
     */
    private ThreadPoolConfig threadPool = new ThreadPoolConfig();

    /**
     * JVM 内存队列的配置。
     * 前缀: `c-delay-queue.jvm`
     */
    private JvmDelayQueueConfig jvm = new JvmDelayQueueConfig();

    @Getter
    @Setter
    public static class ThreadPoolConfig {
        /**
         * 核心线程数，最小值建议 >= 1。
         * 配置键: `c-delay-queue.thread-pool.core-pool-size`
         * 默认: 1
         */
        private int corePoolSize = 1;
        /**
         * 最大线程数，上限建议不超过 CPU*2。
         * 配置键: `c-delay-queue.thread-pool.max-pool-size`
         * 默认: `Integer.MAX_VALUE`（无约束）
         */
        private int maxPoolSize = Integer.MAX_VALUE;
        /**
         * 队列容量。`Integer.MAX_VALUE` 表示无界队列，可能导致堆内存压力。
         * 配置键: `c-delay-queue.thread-pool.queue-capacity`
         * 默认: `Integer.MAX_VALUE`
         */
        private int queueCapacity = Integer.MAX_VALUE;
        /**
         * 非核心线程空闲存活时间（秒）。
         * 配置键: `c-delay-queue.thread-pool.keep-alive-seconds`
         * 默认: 60
         */
        private int keepAliveSeconds = 60;
        /**
         * 线程名前缀。
         * 配置键: `c-delay-queue.thread-pool.thread-name-prefix`
         * 默认: `c-dq-consumer-`
         */
        private String threadNamePrefix = "c-dq-consumer-";
    }

    /**
     * JVM 延迟队列的具体配置。
     */
    @Getter
    @Setter
    public static class JvmDelayQueueConfig {
        /**
         * 任务触发执行的延迟时间（毫秒）。
         * 配置键: `c-delay-queue.jvm.delay-ms`
         * 默认: 3000
         * 范围: >= 0（0 表示立即执行）。
         */
        private long delayMs = 3000;
    }

}
